package com.me.study.jdk8.methodReferences;

import org.junit.Test;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 引用类的构造器: <p>
 *      Person::new     <p></p>
 * 引用数组的构造器:  <p>
 *      String[]::new
 *
 * @author ME
 * @date 2020/9/17
 */
public class TestConstructor {

    /**
     * 引用构造方法: 某个构造方法结构上与 @FunctionalInterface中对应的方法相同，那么就可以直接引用给 @FunctionalInterface
     */
    @Test
    public void testConstructorReference() {
        // 调用Person 无参构造函数
        Supplier<Student> supplier = ()->new Student();
        // 由Supplier<Student> 可以推断出 Student::new  中 Student 的类型
        Supplier<Student> supplier1 = Student::new;
        supplier1.get();

        //需要有无参构造函数
        Function<Integer, String[]> function = (s) -> new String[10];
        Function<Integer, String[]> function1 = String[]::new;
        String[] strArr = function1.apply(0);
        System.out.println(strArr);

        // 有参构造函数
        Consumer<Integer> c1 = (i)->new Student(i);
        Consumer<Integer> c2 = Student::new;
        c1.accept(1);//有参构造
        c2.accept(1);//有参构造
        // 第一个参数String Student的参数类型，第一个参数是new Student实例的参数
        Function<String, Student> function2 = Student::new;//有参构造String

        ConstructorReference reference = String::new;
        String words = reference.speak("I'm so happy!");
        System.out.println(words);
    }

    @FunctionalInterface
    public interface ConstructorReference {
        String speak(String s);
    }

    class Student{
        public Student(int i) {
            System.out.println("Student 有参构造");
        }
        public Student(String s) {
            System.out.println("Student 有参构造String");
        }
        public Student() {
            System.out.println("Student 无参构造");
        }
    }
}
